package io.gitee.yth.design.pattern.test.core.pattern.behavioral.interpreter;

/**
 * 上下文Context存储当前环境变量信息，并且提供<code>lookup()</code>接口
 * -->> Visitor Pattern
 * <p>
 * BooleanExp的实现类中，有一元表达式（例如：NotExp）、二元表达式（例如：AndExp、OrExp），组合成树状结构
 * -->> Composite Pattern
 * <p>
 * 对于叶子节点，即终结符表达式（例如：VariableExp、Constant），应该防止其重复创建
 * -->> Flyweight Pattern
 * <p>
 * 如果需要遍历语法树 -->> Iterator Pattern
 * <p>
 * BooleanExp提供<code>copy</code>接口 -->> Prototype Pattern
 *
 * @author yth
 * @since 2023-05-01-22:45
 */
public interface BooleanExp {

    /**
     * @param context 上下文
     * @return 当前布尔表达式的值
     */
    boolean evaluate(Context context);

    /**
     * 在当前布尔表达式中，把变量<code>var</code>的引用替换为某布尔表达式<code>exp</code>
     *
     * @param var 被替换的变量名称（source）
     * @param exp 将要替换成的布尔表达式（target）
     * @return 替换后的布尔表达式
     */
    BooleanExp replace(String var, BooleanExp exp);

    /**
     * @return 当前对象的克隆
     */
    BooleanExp copy();

}
